package com.ljx.ui;

import com.sun.tools.javac.Main;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class MainJFrame extends JFrame implements ActionListener {

    JTable table;
    JButton add = new JButton("添加");//添加按钮
    JButton update = new JButton("修改");//修改按钮
    JButton delete = new JButton("删除");//删除按钮

    //创建菜单的导入和导出
    JMenuItem exportItem = new JMenuItem("导出(压缩)");//导出菜单
    JMenuItem importItem = new JMenuItem("导入(解压)");//导入菜单


    //从构造启动
    public MainJFrame() throws IOException
    {
        initJFrame();

        initView();

        initJMenuBar();

        this.setVisible(true);
    }

    public void showJDialog(String content)
    {
        //创建一个弹框对象
        JDialog jDialog = new JDialog();
        //给弹框设置大小
        jDialog.setSize(200,150);
        //让弹框置顶
        jDialog.setAlwaysOnTop(true);
        //让弹框居中
        jDialog.setLocationRelativeTo(null);
        //弹框不关闭永远无法操作下面的界面
        jDialog.setModal(true);
        jDialog.setLayout(null);

        //创建JLabel对象管理文字并添加到弹框当中
        Font font = new Font("微软雅黑",Font.PLAIN,14);
        JLabel Warning = new JLabel();
        Warning.setText(content);
        Warning.setFont(font);
        Warning.setBounds(45,45,150,30);
        jDialog.getContentPane().add(Warning);

        //显示弹框
        jDialog.setVisible(true);
    }
    private void initJMenuBar() {
        //上方功能菜单栏
        JMenuBar jMenuBar = new JMenuBar();

        JMenu function = new JMenu("功能");

        function.add(exportItem);
        function.add(importItem);

        jMenuBar.add(function);

        exportItem.addActionListener(this);
        importItem.addActionListener(this);

        //给菜单设置颜色
        jMenuBar.setBackground(new Color(230,230,230));

        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);
    }

    private void initView() throws IOException {
        //添加组件
        //标题文字
        JLabel title = new JLabel("每日一记");
        title.setBounds(235,20,584,50);
        title.setFont(new Font("微软雅黑",Font.BOLD,32));
        this.getContentPane().add(title);

        //表头，表体，绑定点击事件
        //表头
        Object []tableTitles = {"编号","标题","正文"};
        //表体
        Object [][]tableDatas = {
                {"编号1","标题1","正文1"},
                {"编号2","标题2","正文2"},
                {"编号3","标题3","正文3"},
                {"编号4","标题4","正文4"},
                {"编号5","标题5","正文5"},
                {"编号6","标题6","正文6"},
                {"编号7","标题7","正文7"},
                {"编号8","标题8","正文8"},
                {"编号9","标题9","正文9"},
                {"编号10","标题10","正文10"},
                {"编号11","标题11","正文11"},
                {"编号12","标题12","正文12"},
                {"编号13","标题13","正文13"},
                {"编号14","标题14","正文14"},
                {"编号15","标题15","正文15"},
                {"编号16","标题16","正文16"},
                {"编号17","标题17","正文17"},
                {"编号18","标题18","正文18"},
                {"编号19","标题19","正文19"},
                {"编号20","标题20","正文20"},
                {"编号21","标题21","正文21"},
                {"编号22","标题22","正文22"},
                {"编号23","标题23","正文23"},
                {"编号24","标题24","正文24"},
                {"编号25","标题25","正文25"},
                {"编号26","标题26","正文26"},
                {"编号27","标题27","正文27"},
                {"编号28","标题28","正文28"},
                {"编号29","标题29","正文29"},
                {"编号30","标题30","正文30"},
        };

        //更新菜单栏信息,直接遍历files文件夹即可
        File noteFiles = new File("src/files");
        File[] files = noteFiles.listFiles();
        for (File file : files) {
            int num = Integer.parseInt(file.getName().split("\\.")[0]);
            tableDatas[num][0] = (num+1)+"";
            BufferedReader br = new BufferedReader(new FileReader(file));
            String tt = br.readLine();//标题
            tableDatas[num][1] = tt;
            String ct = br.readLine();//正文简略内容
            tableDatas[num][2] = ct;
            br.close();
        }

        //定义表格组件
        //并给表格设置标题和内容
        table = new JTable(tableDatas,tableTitles);
        table.setBounds(50,80,504,380);

        //创建可滚动组件，并把表格组件放在滚动组件中间
        //好处：如果表格中数据过多，可以进行上下滚动
        JScrollPane jScrollPane = new JScrollPane(table);
        jScrollPane.setBounds(50,80,504,380);
        this.getContentPane().add(jScrollPane);

        //三个按钮设置宽高，绑定点击事件
        add.setBounds(40,490,140,40);
        update.setBounds(222,490,140,40);
        delete.setBounds(404,490,140,40);

        add.setFont(new Font("微软雅黑",Font.PLAIN,20));
        update.setFont(new Font("微软雅黑",Font.PLAIN,20));
        delete.setFont(new Font("微软雅黑",Font.PLAIN,20));

        //绑定点击事件
        add.addActionListener(this);
        update.addActionListener(this);
        delete.addActionListener(this);

        //添加到页面中
        this.getContentPane().add(add);
        this.getContentPane().add(update);
        this.getContentPane().add(delete);
    }

    private void initJFrame() {
        //设置界面的宽高
        this.setSize(600,600);
        //设置界面的标题
        this.setTitle("每日一记");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置关闭模式
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        //设置居中
        this.setLocationRelativeTo(null);
        //设置关闭画面内默认布局
        this.setLayout(null);
        //设置背景颜色
        this.getContentPane().setBackground(new Color(212,212,212));
    }


    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == add)
        {
            //跳转到添加界面
            System.out.println("添加");
            this.setVisible(false);
            try {
                new AddJFrame();
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        }
        else if(e.getSource() == update)
        {
            //跳转到修改界面
            System.out.println("修改");
            //逻辑：
            //1.先判断用户有没有选择表格中的数据
            //2.如果没有选择，弹框提示：未选择。此时提示的弹框用showJDialog方法即可
            //3.如果选择了，跳转添加界面

            //获取用户选择了表格中的哪一行
            //i = 0: 表示用户选择了第一行
            //i = 1: 表示用户选择了第一行
            //i有两个作用：
            //i小于0，表示用户没有选择，此时无法修改
            //i大于等于0：通过这个行数就可以获取二维数组中对应的数据
            int i = table.getSelectedRow();
            System.out.println(i);

            if(i == -1) {
                //如果没有选择，弹框提示：未选择。此时提示的弹框用showJDialog方法即可
                showJDialog("未选择");
                return;
            }
            //若选择的选项并没有对应的文件
            File file = new File("src/files/"+i+".txt");
            if(!file.exists())
            {
                showJDialog("对应的文件不存在");
                return;
            }
            //正常情况
            this.setVisible(false);
            try {
                new UpdateJFrame(i);
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        }
        else if(e.getSource() == delete)
        {
            System.out.println("删除按钮被点击");
            //逻辑：
            //1.先判断用户有没有选择表格中的数据
            //2.如果没有选择，弹框提示：未选择。此时提示的弹框用showJDialog方法即可
            //3.如果选择了，弹框提示：是否确定删除。此时提示的弹框用showChooseJDialog方法

            //获取选择行数，从0开始
            int i = table.getSelectedRow();
            System.out.println(i);
            if(i == -1) {
                //如果没有选择，弹框提示：未选择。此时提示的弹框用showJDialog方法即可
                showJDialog("未选择");
                return;
            }
            //若选择的选项并没有对应的文件
            File file = new File("src/files/"+i+".txt");
            if(!file.exists())
            {
                showJDialog("对应的文件不存在");
                return;
            }

            //作用：展示一个带有确定和取消按钮的弹框
            //方法的返回值：0 表示用户点击了确定
            //             1 表示用户点击了取消
            //该弹框用于用户删除时候，询问用户是否确定删除
            int j = showChooseJDialog();
            System.out.println(j);

            if(j == 0)
            {
                //删除的同时还要更新添加那边的count
                try {
                    BufferedReader cbr = new BufferedReader(new FileReader("src/count.txt"));
                    int count = Integer.parseInt(cbr.readLine());
                    cbr.close();
                    count--;
                    BufferedWriter cbw = new BufferedWriter(new FileWriter("src/count.txt"));
                    cbw.write(count+"");
                    cbw.newLine();
                    cbw.close();
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }

                //确定，执行删除代码
                boolean b = file.delete();
                System.out.println(b);
                try {
                    this.setVisible(false);
                    new MainJFrame();
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }
        }
        else if(e.getSource() == exportItem)
        {
            try {
                //导出,压缩
                File noteFile = new File("src/files");
                File dest = new File("src/ZipFiles");
                File[] files = noteFile.listFiles();
                //1.创建压缩流关联压缩包
                ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File(dest,"a.zip")));
                for (File file : files) {
                    //2.创建ZipEntry对象，表示压缩包里面每一个文件和文件夹
                    //参数：压缩包里面的路径
                    ZipEntry entry = new ZipEntry(file.getName());
                    //ZipEntry对象放到压缩包中
                    zos.putNextEntry(entry);
                    //源文件写到压缩包中
                    FileInputStream fis = new FileInputStream(file);
                    int b;
                    while((b = fis.read())!=-1)
                    {
                        zos.write(b);
                    }
                    zos.closeEntry();
                    fis.close();
                }
                zos.close();
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        }
        else if(e.getSource() == importItem)
        {
            //导入(解压)
            //解压的本质：把压缩包里面每一个文件或者文件夹读取出来，按照层级拷贝到目的地当中
            //创建一个解压缩流来读取压缩包中的数据
            try {
                ZipInputStream zip = new ZipInputStream(new FileInputStream("src/ZipFiles/a.zip"));
                //要先获取到压缩包里面每一个zipentry对象
                //表示当前在压缩包中获取到的文件或者文件夹
                ZipEntry entry;
                while((entry=zip.getNextEntry())!=null)
                {
                    System.out.println(entry);
                    //不存在是文件夹的情况
                    FileOutputStream fos = new FileOutputStream(new File("src/files",entry.toString()));
                    int b;
                    while((b = zip.read())!=-1)
                    {
                        //写到目的地
                        fos.write(b);
                    }
                    fos.close();
                    zip.closeEntry();
                }
                zip.close();
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        }
    }

    /*
     *  作用：展示一个带有确定和取消按钮的弹框
     *
     *  方法的返回值：
     *       0 表示用户点击了确定
     *       1 表示用户点击了取消
     *       该弹框用于用户删除时候，询问用户是否确定删除
     * */
    public int showChooseJDialog() {
        return JOptionPane.showConfirmDialog(this, "是否删除选中数据？","删除信息确认",JOptionPane.YES_NO_OPTION);
    }
}
